package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyVetoException;
import java.util.HashSet;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import comun.Usuario;
import logica_de_negocio.ExcepDeleteOnCascade;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.gestorUsuario;

public class TablaUsuario extends JInternalFrame implements
		ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	protected MenuInicial clasePadre;
	protected JButton jbVerComentarPun, jbVerContra, jbEliminar, jbSalir;
	protected JPanel jpBotones;
	protected JScrollPane scrollPane;
	protected JTable tablaDatos;
	protected HashSet<Usuario> lu;
	protected Usuario usu;
	private boolean contra;

	public TablaUsuario(MenuInicial clasePadre, boolean contra,
			Usuario usu) {
		super("Listar usuario", true, false, false, false);
		this.setVisible(true);// VISIBLE
		this.setSize(500, 500);// TAMANO
		this.clasePadre = clasePadre;
		this.usu = usu;
		this.contra = contra;
		this.subComp();

	}

	public void subComp() {

		this.getContentPane().setLayout(new BorderLayout());
		// TABLA

		// CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
		scrollPane = new JScrollPane(tablaDatos);

		// ANADIMOS EL SCROLLPANE AL PANEL
		this.add(scrollPane, "Center");

		jpBotones = new JPanel(new FlowLayout());
		if (usu.isEsAdmin()) {
			ImageIcon Iborrar = createImageIcon("/logica_de_presentacion/imagenes/BORRAR.gif");

			jbEliminar = new JButton("Eliminar", Iborrar);
			jbEliminar.addActionListener(this);
			jbEliminar.setMnemonic(KeyEvent.VK_E);
			jbEliminar.setToolTipText("Eliminar usuario de la base de datos");
			jpBotones.add(jbEliminar);
		}

		if (contra) {
			jbVerComentarPun = new JButton("Recuperar Contrasena");
			jbVerComentarPun.addActionListener(this);
			jbVerComentarPun.setMnemonic(KeyEvent.VK_R);
			jbVerComentarPun
					.setToolTipText("Recuperar la contrasena del usuario selecionado");
			jpBotones.add(jbVerComentarPun);
		} else {
			jbVerComentarPun = new JButton("Ver Comentarios y/o puntuaciones");
			jbVerComentarPun.addActionListener(this);
			jbVerComentarPun.setMnemonic(KeyEvent.VK_V);
			jbVerComentarPun
					.setToolTipText("Ver los comentarios y/o puntuaciones realizadas por el usuario");
			jpBotones.add(jbVerComentarPun);
		}

		ImageIcon salir = createImageIcon("/logica_de_presentacion/imagenes/SALIR.gif");
		jbSalir = new JButton("Salir", salir);
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);

		this.getContentPane().add(jpBotones, "South");

	}
	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsado = (JButton) e.getSource();
		if (botonPulsado == jbEliminar) {

			try {
				String StringUsuario = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				gestorUsuario gu = new gestorUsuario();
				Boolean corec = false;
				try {
					corec = gu.borrar(gu.getId(StringUsuario),
							new ExcepDeleteOnCascade());
					if (gu.adminPorDefecto()) {
						JOptionPane
								.showMessageDialog(new Frame(),
										"HA BORRADO TODOS LOS USUARIOS SE HA CARGADO UNO POR DEFECTO");
						this.dispose();
					}
				} catch (ExcepDeleteOnCascade e1) {
					int res = JOptionPane
							.showConfirmDialog(
									new Frame(),
									"Al eliminar la pelicula tambien se eliminaran los comentarios de los usuarios y estos dejaran de seguir la pelicula");
					// YES=0, NO=1,Cancel =2
					if (res == 0) {
						e1.setAceptado(true);
						try {
							corec = gu.borrar(gu.getId(StringUsuario), e1);

							if (gu.adminPorDefecto()) {
								JOptionPane
										.showMessageDialog(new Frame(),
												"HA BORRADO TODOS LOS USUARIOS SE HA CARGADO UNO POR DEFECTO");
								this.dispose();
							}

						} catch (ExcepDeleteOnCascade e2) {
						}
					}
				}

				if (corec) {

					JOptionPane.showMessageDialog(new Frame(),
							"Se ha borrado el usuario");
					this.refreshTable();

				} else {
					JOptionPane.showMessageDialog(new Frame(),
							"NO!!!! se ha borrado el usuario");
				}

			} catch (java.lang.IndexOutOfBoundsException apuntNull) {
				JOptionPane.showMessageDialog(new Frame(),
						"No ha selecionado ninguna linea");
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay informacion en la base de datos");
				this.dispose();
			}

		}

		if (botonPulsado == jbVerComentarPun) {
			try {
				String StringUsuario = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				gestorUsuario gu = new gestorUsuario();
				Usuario usuDes;
				try {
					usuDes = gu.getUsuario(gu.getId(StringUsuario));

					if (contra) {

						JOptionPane.showMessageDialog(new Frame(),
								"La contrasena es --> " + usuDes.getPassWord());

					} else {
						FormularioCapitulos_Peliculas formularioCapitulos_Peliculas = new FormularioCapitulos_Peliculas(
								clasePadre, usuDes);
						clasePadre.add(formularioCapitulos_Peliculas);
						try {
							formularioCapitulos_Peliculas.setSelected(true);
						} catch (PropertyVetoException e1) {
						}
						formularioCapitulos_Peliculas.toFront();
						this.dispose();
					}
				} catch (FaltanDatosEnLaBaseDeDatos e2) {
					JOptionPane.showMessageDialog(new Frame(), e2.getFalta());
				} catch (ClassNotFoundException e2) {
					JOptionPane.showMessageDialog(new Frame(),
							"No hay informacion en la base de datos");
					this.dispose();
				}
			} catch (java.lang.IndexOutOfBoundsException ee) {
				JOptionPane.showMessageDialog(new Frame(),
						"No ha selecionado ninguna linea");
			}

		}
		if (botonPulsado == jbSalir) {
			this.dispose();
		}
	}

	private void refreshTable() throws ClassNotFoundException {
		gestorUsuario gc = new gestorUsuario();
		lu = gc.getUsuarios();
		myTable tpm = (myTable) tablaDatos.getModel();
		tpm.setData();
		tpm.fireTableDataChanged();

	}

	public void cargarUsuario() throws ClassNotFoundException {

		gestorUsuario gu = new gestorUsuario();
		gu.cargarDatos();

		lu = gu.getUsuarios();
		crearTabla();

		this.subComp();
	}

	public void crearTabla() {

		tablaDatos = null;// VACIAMOS SI EXISTE ALUGUNA
		myTable tmp = new myTable();
		tablaDatos = new JTable(tmp);

		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200, 200));
		tablaDatos.setEnabled(true);

		// QUE PODAMOS SELECIONAR LAS FILAS
		tablaDatos.setRowSelectionAllowed(true);

		// QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();

		// SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(true);

		// CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true);

	}

	class myTable extends AbstractTableModel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName;
		private Object[][] data;

		public myTable() {

			super();
			if (usu.isEsAdmin()) {
				String[] col = { "Usuario", "Es Administrador" };
				columName = col;
			} else {
				String[] col = { "Usuario" };
				columName = col;
			}
			setData();
		}
		@Override
		public int getColumnCount() {
			return columName.length;
		}
		@Override
		public int getRowCount() {
			return data.length;
		}
		@Override
		public String getColumnName(int col) {
			return columName[col];
		}
		@Override
		public Object getValueAt(int row, int col) {
			Object a = data[row][col];
			return a;
		}

		public void setData() {

			int filas = lu.size();
			int cont = 0;
			data = new Object[filas][];

			// RELLENO DATOS
			for (Usuario u : lu) {

				if (usu.isEsAdmin()) {
					Object[] a = { u.getUsuario(), u.isEsAdmin() };
					data[cont] = a;
					cont++;
				} else {
					Object[] a = { u.getUsuario() };
					data[cont] = a;
					cont++;
				}
			}
		}
	}

	/** Returns an ImageIcon, or null if the path was invalid. */
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = Button.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}
}